#ifndef STYLE_H
#define STYLE_H

#ifdef SCI_NAMESPACE
namespace Scintilla {
#endif

  struct FontSpecification {
    const char *fontName;
    int weight;
    bool italic;
    int size;
    int characterSet;
    int extraFontFlag;
    FontSpecification() :
      fontName( 0 ),
      weight( SC_WEIGHT_NORMAL ),
      italic( false ),
      size( 10 * SC_FONT_SIZE_MULTIPLIER ),
      characterSet( 0 ),
      extraFontFlag( 0 ) {
    }
    bool operator==( const FontSpecification &other ) const;
    bool operator<( const FontSpecification &other ) const;
  };


  class FontAlias : public Font {

      FontAlias &operator=( const FontAlias & );
    public:
      FontAlias();
      FontAlias( const FontAlias & );
      virtual ~FontAlias();
      void MakeAlias( Font &fontOrigin );
      void ClearFont();
  };

  struct FontMeasurements {
    unsigned int ascent;
    unsigned int descent;
    XYPOSITION aveCharWidth;
    XYPOSITION spaceWidth;
    int sizeZoomed;
    FontMeasurements();
    void Clear();
  };


  class Style : public FontSpecification, public FontMeasurements {
    public:
      ColourDesired fore;
      ColourDesired back;
      bool eolFilled;
      bool underline;
      enum ecaseForced {caseMixed, caseUpper, caseLower};
      ecaseForced caseForce;
      bool visible;
      bool changeable;
      bool hotspot;

      FontAlias font;

      Style();
      Style( const Style &source );
      ~Style();
      Style &operator=( const Style &source );
      void Clear( ColourDesired fore_, ColourDesired back_,
                  int size_,
                  const char *fontName_, int characterSet_,
                  int weight_, bool italic_, bool eolFilled_,
                  bool underline_, ecaseForced caseForce_,
                  bool visible_, bool changeable_, bool hotspot_ );
      void ClearTo( const Style &source );
      void Copy( Font &font_, const FontMeasurements &fm_ );
      bool IsProtected() const { return !( changeable && visible );}
  };

  #ifdef SCI_NAMESPACE
}
  #endif

#endif
